;******************************************************************************************************
; fread.asm
;
; Abre un archivo, lee registros, los imprime y lo cierra
;******************************************************************************************************


.model small
.stack
.data

fileName	db	"archi.txt",0	;el nombre del archivo debe terminar con un 0 binario!!!!
fHandle		dw	?
registro	db	15 dup(?)

msjErrOpen	db	"Error en apertura$"
msjErrRead	db	"Error en lectura$"
msjErrClose	db	"Error en cierre$"

.code
start:
	mov  ax,@data  ;ds <-- dir del segmento de datos
	mov  ds,ax
         
	;ABRE EL ARCHIVO PARA LECTURA
	mov	al,0		         ;al = tipo de acceso (0=lectura; 1=escritura; 2=lectura y escritura)
	mov	dx,offset fileName	;dx = dir del nombre del archivo
	mov	ah,3dh		         ;ah = servicio para abrir archivo 3dh
	int	21h
	jc	errOpen
	mov	fHandle,ax	         ; en ax queda el handle del archivo

	;LEE EL ARCHIVO (registro 1)
	mov	bx,fHandle	;bx = handle del archivo
	mov	cx,10		;cx = cantidad de bytes a escribir
	mov	dx,offset registro	;dx = dir del area de memoria q contiene los bytes leidos del archivo
	mov	ah,3fh		;ah = servicio para escribir un archivo: 40h
	int	21h
	jc	errRead
	;IMPRIME POR PANTALLA (registro 1)
	mov	registro[10],10
	mov	registro[11],13
	mov	registro[12],'$'
	mov	dx,offset registro
	mov	ah,9
	int	21h

	;LEE EL ARCHIVO (registro 2)
	mov	bx,fHandle	;bx = handle del archivo
	mov	cx,10		;cx = cantidad de bytes a escribir
	mov	dx,offset registro	;dx = dir del area de memoria q contiene los bytes leidos del archivo
	mov	ah,3fh		;ah = servicio para escribir un archivo: 40h
	int	21h
	jc	errRead
	;IMPRIME POR PANTALLA (registro 2)
	mov	registro[10],10
	mov	registro[11],13
	mov	registro[12],'$'
	mov	dx,offset registro
	mov	ah,9
	int	21h

	;CIERRA EL ARCHIVO
	mov	bx,fHandle	;bx = handle del archivo
	mov	ah,3eh		;ah = servicio para cerrar archivo: 3eh
	int	21h
	jc	errClose
	jmp	fin

errOpen:
	mov	dx,offset msjErrOpen
	mov	ah,9
	int	21h
	jmp	fin
errRead:
	mov	dx,offset msjErrRead
	mov	ah,9
	int	21h
	jmp	fin
errClose:
	mov	dx,offset msjErrClose
	mov	ah,9
	int	21h
	jmp	fin
fin:
	mov  ax,4c00h  ; retornar al DOS
	int  21h
end start